
package org.report.pdf.object;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java creator document
// Archivo : TableCreator.java
// Descripcion : Clase TableCreator
// *************************************************************************/
// Version : 1.0.5
// Fecha de Creación: 11 de Julio de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import java.awt.Color;

public class TableCreator {
    
    // Atributos finales de la clase TableCreator
    
    private final int NUMBER_CELL_DEFAULT = 1;
    
    // Atributos de la clase TableCreator
    
    private PdfPTable pdfTable;
    private int alignment;
    private Font font;
    private Color background = Color.WHITE;
    
    // Constructor de la clase TableCreator
    
    public TableCreator(int columns) {
        initTable(columns);
    }
    
    // Metodos de la clase TableCreator
    
    /**
      * Este método nos permite instanciar la tabla a utilizar para 
      * Reporte. Donde el Número de Columnas se establece con un dato
      * <code>int</code>.
      * @param columns Número de columnas de la Tabla a definir
    */
    
    private void initTable(int columns) {
        pdfTable = new PdfPTable(columns); setWidthTable(80f);
    }
    
    /**
      * Este método nos permite definir el color de Fondo de las Celdas
      * de la Tabla. Donde el color de fondo se establece con un objeto
      * <code>BaseColor</code>.
      * @param backgroundColor Color de Fondo de la Celda
    */
    
    public void setBackgroundCells(Color backgroundColor) {
        this.background = backgroundColor;
    }
    
    /**
      * Este método nos permite definir la Alineación de la información 
      * de la celda en la Tabla. Donde la alineación se establece con un
      * dato <code>int</code>.
      * @param alignment Alineación de la Información de la Celda
    */
    
    public void setAlignmentCells(int alignment) {
        this.alignment = alignment;
    }
    
    /**
      * Este método nos permite definir el Tipo de Fuente del texto de
      * la celda en la Tabla. Donde el tipo de fuente se establece con 
      * un objeto <code>FontCreator</code>
      * @param font Fuente a establecer en la celda de la Tabla
    */
    
    public void setFontCells(FontCreator font) {
        this.font = font.getFont();
    }
    
    /**
      * Este método nos permite definir el Tipo de Fuente del texto de
      * la celda en la Tabla. Donde el tipo de fuente se establece con 
      * un objeto <code>Font</code>
      * @param font Fuente a establecer en la celda de la Tabla
    */
    
    public void setFontCells(Font font) {
        this.font = font;
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment
      * @param font
      * @return 
    */
    
    private PdfPCell createCell(String texto, Color background, int alignment, Font font) {
        PdfPCell celda = new PdfPCell(new Phrase(texto,font));
        celda.setBackgroundColor(background);
        celda.setHorizontalAlignment(alignment);
        
        return celda; // Retornando Celda creada
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param alignment
      * @return 
    */
    
    private PdfPCell createCell(Image image, Color background, int alignment) {
        PdfPCell celda = new PdfPCell(image);
        celda.setBackgroundColor(background);
        celda.setHorizontalAlignment(alignment);
        
        return celda; // Retornando Celda creada
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment
      * @param columns 
     * @param font 
    */
    
    public void addCouplingColumns(String texto, Color background, int alignment, int columns, Font font) {
        // Creando y configurando celdas
        PdfPCell celda = createCell(texto,background,alignment,font);
        celda.setColspan(columns); pdfTable.addCell(celda); 
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment
      * @param columns 
    */
    
    public void addCouplingColumns(String texto, Color background, int alignment, int columns) {
        addCouplingColumns(texto,background,alignment,columns,font);
    }
    
    /**
      * 
      * @param texto
      * @param alignment
      * @param columns 
    */
    
    public void addCouplingColumns(String texto, int alignment, int columns) {
        addCouplingColumns(texto,background,alignment,columns);
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param columns 
    */
    
    public void addCouplingColumns(String texto, Color background, int columns) {
        addCouplingColumns(texto,background,alignment,columns);
    }
    
    /**
      * 
      * @param texto
      * @param columns 
    */
    
    public void addCouplingColumns(String texto, int columns) {
        addCouplingColumns(texto,alignment,columns);
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment
      * @param rows 
     * @param font 
    */
    
    public void addCouplingRows(String texto, Color background, int alignment, int rows,Font font) {
        // Creando y configurando celdas
        PdfPCell celda = createCell(texto,background,alignment,font);
        celda.setRowspan(rows); pdfTable.addCell(celda); 
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment
      * @param rows 
    */
    
    public void addCouplingRows(String texto, Color background, int alignment, int rows) {
        addCouplingRows(texto,background,alignment,rows,font);
    }
    
    /**
      * 
      * @param texto
      * @param alignment
      * @param rows 
    */
    
    public void addCouplingRows(String texto, int alignment, int rows) {
        addCouplingRows(texto,background,alignment,rows);
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param rows 
    */
    
    public void addCouplingRows(String texto, Color background, int rows) {
        addCouplingRows(texto,background,alignment,rows);
    }
    
    /**
      * 
      * @param texto
      * @param rows 
    */
    
    public void addCouplingRows(String texto, int rows) {
        addCouplingRows(texto,alignment,rows);
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment 
     * @param font 
    */
    
    public void add(String texto, Color background, int alignment, Font font) {
        addCouplingColumns(texto,background,alignment,NUMBER_CELL_DEFAULT,font);
    }
    
    /**
      * 
      * @param texto
      * @param background
      * @param alignment 
    */
    
    public void add(String texto, Color background, int alignment) {
        add(texto,background,alignment,font);
    }
    
    /**
      * 
      * @param texto
      * @param alignment 
    */
    
    public void add(String texto, int alignment) {
        add(texto,background,alignment);
    }
    
    /**
      * 
      * @param texto
      * @param background 
    */
    
    public void add(String texto, Color background) {
        add(texto,background,alignment);
    }
    
    /**
      * 
      * @param texto 
    */
    
    public void add(String texto) {
        add(texto,background,alignment);
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param alignment
      * @param columns 
    */
    
    public void addCouplingColumns(Image image, Color background, int alignment, int columns) {
        // Creando y configurando celdas
        PdfPCell celda = createCell(image,background,alignment);
        celda.setColspan(columns); pdfTable.addCell(celda); 
    }
    
    /**
      * 
      * @param image
      * @param alignment
      * @param columns 
    */
    
    public void addCouplingColumns(Image image, int alignment, int columns) {
        addCouplingColumns(image,background,alignment,columns);
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param columns 
    */
    
    public void addCouplingColumns(Image image, Color background, int columns) {
        addCouplingColumns(image,background,alignment,columns);
    }
    
    /**
      * 
      * @param image
      * @param columns 
    */
    
    public void addCouplingColumns(Image image, int columns) {
        addCouplingColumns(image,alignment,columns);
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param alignment
      * @param rows 
    */
    
    public void addCouplingRows(Image image, Color background, int alignment, int rows) {
        // Creando y configurando celdas
        PdfPCell celda = createCell(image,background,alignment);
        celda.setRowspan(rows); pdfTable.addCell(celda); 
    }
    
    /**
      * 
      * @param image
      * @param alignment
      * @param rows 
    */
    
    public void addCouplingRows(Image image, int alignment, int rows) {
        addCouplingRows(image,background,alignment,rows);
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param rows 
    */
    
    public void addCouplingRows(Image image, Color background, int rows) {
        addCouplingColumns(image,background,alignment,rows);
    }
    
    /**
      * 
      * @param image
      * @param rows 
    */
    
    public void addCouplingRows(Image image, int rows) {
        addCouplingRows(image,alignment,rows);
    }
    
    /**
      * 
      * @param image
      * @param background
      * @param alignment 
    */
    
    public void add(Image image, Color background, int alignment) {
        addCouplingColumns(image,background,alignment,NUMBER_CELL_DEFAULT);
    }
    
    /**
      * 
      * @param image
      * @param alignment 
    */
    
    public void add(Image image, int alignment) {
        add(image,background,alignment);
    }
    
    /**
      * 
      * @param image
      * @param background 
    */
    
    public void add(Image image, Color background) {
        add(image,background,alignment);
    }
    
    /**
      * 
      * @param image 
    */
    
    public void add(Image image) {
        add(image,background,alignment);
    }
    
    /**
      * Este método nos permite definir el Ancho de la Tabla en el
      * Documento PDF, el cual es porcentual a sus dimensiones. 
      * Donde el ancho se establece con un dato <code>float</code>.
      * @param width Ancho de la Tabla en el Documento
    */
    
    public void setWidthTable(float width) {
        pdfTable.setWidthPercentage(width);
    }
    
    /**
      * Este método nos permite establecer las dimensiones de las
      * columnas de la Tabla. Donde las dimensiones se establecen
      * con un objeto <code>int []</code>, ademas estas se determinan
      * con porcentajes en el vector.
      * @param widths Dimensiones de las columnas de la Tabla
    */
    
    public void setWidthsColumns(int [] widths) {
        if (widths.length == pdfTable.getNumberOfColumns()) {
            try {
                pdfTable.setWidths(widths);
            } // Se establecieron las dimensiones por Porcentajes
            
            catch (DocumentException ex) {
                System.out.println(ex.getMessage());
            }
        } // Ocurrio un error al tratar de Establecer Dimensiones
    }
    
    /**
      * Este método nos permite obtener la Tabla a insertar en el Documento.
      * @return Retorna la tabla en un objeto <code>PdfPTable</code>.
    */
    
    public PdfPTable getTable() {
        return pdfTable;
    }
}